package StatementsUtils;

##########################
#     OmnibusProxy       #
#    Krzysztof Ulman     #
# Politechnika Krakowska #
#      Kraków 2012       #
##########################

use strict;
use warnings;
use encoding 'utf8';

use Try::Tiny;

use Database;
use Screen;

#handler do bazy
our $database;

our $PREPARE_STATEMENT_MODE_SIMPLE = 'SIMPLE';
our $PREPARE_STATEMENT_MODE_ALL_WORDS = 'ALL_WORDS';
our $PREPARE_STATEMENT_MODE_PHASE = 'PHASE';

#zwraca tablice tokenow
sub getTokens {
	my $class = shift;
	my $statement = shift;
	
	#rozdzielenie bialymi znakami...
	my @firstStepTerms = split(/\s+/, $statement); #\.,;:!?-
	
	my @secondStepTerms;
	#przefiltrowanie (usuniecie smieci)
	foreach my $oldTerm (@firstStepTerms) {
		if(length($oldTerm) > 0 && $oldTerm =~ m/([a-zóęąśłżźćń']+)/i) { #TODO co z innymi znakami i co z liczbami: ' 0-9
			my $newTerm = $1;
			#sprawdzenie, czy apostrof jest uzyty w stylu: murphy'ego
			if($newTerm !~ m/^'/ && $newTerm !~ m/'$/) {
				push(@secondStepTerms, $newTerm);
			}
		}
	}
	
	#wypisanie do celow sprawdzenia
	my $tmp;
	foreach my $t (@secondStepTerms) {
		$tmp .= $t .', ';
	}
	$tmp = substr($tmp, 0, length($tmp) - 2);
	Screen->printAndLogDebug('Tokeny dla frazy {' . $statement . '}: ' . $tmp);
	
	return \@secondStepTerms;
}

#tworzy string, ktory zostanie wyslany do wyszukiwarki
sub prepareStatementForSearcher {
	my $class = shift;
	my $statement = shift;
	my $mode = shift;

	if($mode eq $PREPARE_STATEMENT_MODE_SIMPLE) {
		return $statement;
	} elsif($mode eq $PREPARE_STATEMENT_MODE_PHASE) {
		return '"' . $statement . '"';
	} elsif($mode eq $PREPARE_STATEMENT_MODE_ALL_WORDS) {
		$statement =~ s/\s+/ + /g;
		return $statement;
	} else {
		die('Nieprawidlowy tryb: ' . $mode);
	}
}

#wpisuje nowa fraze do bazy danych
sub insertStatementIntoDb {
	my $class = shift;
	my $statement = shift;
	try {
		if(!$statement || $statement eq '') {
			die('Podana fraza jest pusta.');
		}
		$statement = private_prepareStatementForInsertIntoDb($statement);
		
		#sprawdzamy, czy nie ma juz takiej frazy w bazie - aby nie bylo duplikatow
		my $statementExistsId =  private_getDb()->statementExistsId($statement);
		if($statementExistsId) {
			private_getDb()->insertStatement(undef, $statementExistsId);
			Screen->printAndLogInfo("Fraza {$statement} już istnieje, dodano do ponownego zebrania.");
			return 0;
		} else {
			private_getDb()->insertStatement($statement, undef);
			Screen->printAndLogInfo("Fraza {$statement} dodana.");
			return 1;	
		}
	} catch {
		my $e = $_;
		Screen->printAndLogError('Nie udalo sie dodac frazy: ' . $statement . ' z powodu ' . $e);
	};
}

#tworzy string, ktory zostanie wstawiony do bazy danych
sub private_prepareStatementForInsertIntoDb {
	my $statement = shift;
	
	#wszystko malymi literami
	$statement = lc($statement);
	
	return $statement;
}

#pobiera handler do bazy
sub private_getDb() {
	if(!$database) {
		$database = Database->new();	
	}
	return $database;
}

1;